#include <my_header.h>

/* Usage: ./7_dup_dup filename */
int main(int argc, char *argv[]){                                  
    ARGS_CHECK(argc, 2);
    printf("输出终端\n");   // 向终端输出一句话
    int fd = open(argv[1], O_RDWR);
    ERROR_CHECK(fd, -1, "open");

    int stdout_bak = 7;
    // 备份stdout文件对象，文件描述符7指向它
    dup2(STDOUT_FILENO, stdout_bak);

    // 重定向标准输出到文件
    dup2(fd, STDOUT_FILENO);
    printf("输出到文件\n");

    // 将文件描述符1重新指向stdout对象
    dup2(stdout_bak, STDOUT_FILENO);
    printf("再次输出到终端\n");
    // 后续可以继续重定向

    fflush(stdout);     // 在关闭文件描述符释放文件对象之
// 前，刷新一下标准输出缓冲区，避免数据还留在缓冲区中导致数据丢失
    // 关闭文件描述符
    close(fd);
    close(stdout_bak);

    return 0;
}

#if 0
过程是：

1.第一步，先open一个新文件，分配一个fd文件描述符（一
般就是3）
2. 第二步，由于要反复横跳，所以需要备份一下stdout文
件对象。
    a.比如设置一个整数值int stdout_bak = 7
    b.接下来可以使用dup2(STDOUT_FILENO, stdout_bak )，
通过这个函数调用完成对标准输入的备份。
3.第三步，直接dup2重定向stdout到文件，代码是
：dup2(fd, STDOUT_FILENO)
4.第四步，将文件描述符1重新指向stdout文件对象，使得
标准输出回归终端设备，代码是：dup2(stdout_bak 
                                   , STDOUT_FILENO)
5.....

#endif
